/**
 * 剪贴板工具函数
 * 功能：提供跨浏览器、跨环境的文本复制功能
 * 支持现代剪贴板API和传统execCommand降级方案
 * 适用于HTTP和HTTPS环境
 */

/**
 * 检测当前环境是否支持现代剪贴板API
 * @returns {boolean} 是否支持navigator.clipboard
 */
export function isClipboardSupported() {
  return !!(
    navigator.clipboard && 
    navigator.clipboard.writeText && 
    window.isSecureContext
  )
}

/**
 * 使用现代剪贴板API复制文本
 * @param {string} text 要复制的文本
 * @returns {Promise<boolean>} 复制是否成功
 */
async function copyWithClipboardAPI(text) {
  try {
    await navigator.clipboard.writeText(text)
    return true
  } catch (error) {
    console.warn('剪贴板API复制失败:', error)
    return false
  }
}

/**
 * 使用传统execCommand方法复制文本
 * @param {string} text 要复制的文本
 * @returns {boolean} 复制是否成功
 */
function copyWithExecCommand(text) {
  try {
    // 创建临时textarea元素
    const textArea = document.createElement('textarea')
    textArea.value = text
    
    // 设置样式使其不可见
    textArea.style.position = 'fixed'
    textArea.style.top = '-9999px'
    textArea.style.left = '-9999px'
    textArea.style.opacity = '0'
    textArea.style.pointerEvents = 'none'
    
    // 添加到DOM
    document.body.appendChild(textArea)
    
    // 选择文本
    textArea.focus()
    textArea.select()
    textArea.setSelectionRange(0, text.length)
    
    // 执行复制命令
    const successful = document.execCommand('copy')
    
    // 清理DOM
    document.body.removeChild(textArea)
    
    return successful
  } catch (error) {
    console.warn('execCommand复制失败:', error)
    return false
  }
}

/**
 * 智能复制文本 - 自动选择最佳复制方法
 * @param {string} text 要复制的文本
 * @param {Object} options 配置选项
 * @param {boolean} options.showFallbackDialog 是否在失败时显示降级对话框
 * @param {string} options.fallbackTitle 降级对话框标题
 * @returns {Promise<{success: boolean, method: string, message: string}>}
 */
export async function copyText(text, options = {}) {
  const {
    showFallbackDialog = true,
    fallbackTitle = '复制内容'
  } = options

  // 验证输入
  if (!text || typeof text !== 'string') {
    return {
      success: false,
      method: 'none',
      message: '无效的文本内容'
    }
  }

  // 方法1: 尝试现代剪贴板API
  if (isClipboardSupported()) {
    const success = await copyWithClipboardAPI(text)
    if (success) {
      return {
        success: true,
        method: 'clipboard-api',
        message: '已复制到剪贴板'
      }
    }
  }

  // 方法2: 尝试传统execCommand
  const execSuccess = copyWithExecCommand(text)
  if (execSuccess) {
    return {
      success: true,
      method: 'exec-command',
      message: '已复制到剪贴板'
    }
  }

  // 方法3: 降级到手动复制
  if (showFallbackDialog) {
    showManualCopyDialog(text, fallbackTitle)
  }

  return {
    success: false,
    method: 'manual',
    message: '请手动复制内容'
  }
}

/**
 * 显示手动复制对话框
 * @param {string} text 要复制的文本
 * @param {string} title 对话框标题
 */
function showManualCopyDialog(text, title) {
  // 创建模态对话框
  const modal = document.createElement('div')
  modal.style.cssText = `
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 10000;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  `

  const dialog = document.createElement('div')
  dialog.style.cssText = `
    background: white;
    border-radius: 8px;
    padding: 24px;
    max-width: 600px;
    max-height: 80vh;
    overflow: auto;
    box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
  `

  const titleEl = document.createElement('h3')
  titleEl.textContent = title
  titleEl.style.cssText = `
    margin: 0 0 16px 0;
    color: #333;
    font-size: 18px;
  `

  const instruction = document.createElement('p')
  instruction.textContent = '由于浏览器安全限制，请手动复制以下内容：'
  instruction.style.cssText = `
    margin: 0 0 12px 0;
    color: #666;
    font-size: 14px;
  `

  const textArea = document.createElement('textarea')
  textArea.value = text
  textArea.readOnly = true
  textArea.style.cssText = `
    width: 100%;
    height: 200px;
    padding: 12px;
    border: 1px solid #ddd;
    border-radius: 4px;
    font-family: monospace;
    font-size: 12px;
    resize: vertical;
    margin-bottom: 16px;
  `

  const buttonContainer = document.createElement('div')
  buttonContainer.style.cssText = `
    display: flex;
    justify-content: flex-end;
    gap: 8px;
  `

  const selectButton = document.createElement('button')
  selectButton.textContent = '全选'
  selectButton.style.cssText = `
    padding: 8px 16px;
    border: 1px solid #ddd;
    border-radius: 4px;
    background: #f5f5f5;
    cursor: pointer;
    font-size: 14px;
  `

  const closeButton = document.createElement('button')
  closeButton.textContent = '关闭'
  closeButton.style.cssText = `
    padding: 8px 16px;
    border: none;
    border-radius: 4px;
    background: #1890ff;
    color: white;
    cursor: pointer;
    font-size: 14px;
  `

  // 事件处理
  selectButton.onclick = () => {
    textArea.select()
    textArea.setSelectionRange(0, text.length)
  }

  closeButton.onclick = () => {
    document.body.removeChild(modal)
  }

  modal.onclick = (e) => {
    if (e.target === modal) {
      document.body.removeChild(modal)
    }
  }

  // 组装对话框
  buttonContainer.appendChild(selectButton)
  buttonContainer.appendChild(closeButton)
  
  dialog.appendChild(titleEl)
  dialog.appendChild(instruction)
  dialog.appendChild(textArea)
  dialog.appendChild(buttonContainer)
  
  modal.appendChild(dialog)
  document.body.appendChild(modal)

  // 自动选中文本
  setTimeout(() => {
    textArea.focus()
    textArea.select()
  }, 100)
}

/**
 * 复制文本的简化版本 - 用于快速集成
 * @param {string} text 要复制的文本
 * @returns {Promise<boolean>} 是否成功复制
 */
export async function quickCopy(text) {
  const result = await copyText(text, { showFallbackDialog: false })
  return result.success
}

/**
 * 获取当前环境的复制能力信息
 * @returns {Object} 环境信息
 */
export function getClipboardCapabilities() {
  return {
    hasClipboardAPI: !!navigator.clipboard,
    hasWriteText: !!(navigator.clipboard && navigator.clipboard.writeText),
    isSecureContext: !!window.isSecureContext,
    hasExecCommand: !!document.execCommand,
    isSupported: isClipboardSupported(),
    protocol: window.location.protocol,
    hostname: window.location.hostname
  }
}